/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Xadrez.Modelo;

/**
 *
 * @author Leonardo
 */
public class Rook extends Piece {

    public Rook() {
    }

    public Rook(String color) {

        this.setColor(color);
        this.setFirstMove(true);

    }

    /*@Override
    public void move(Move m, Board board) {

    if (isValidMove(m, board)) {
    m.getDestination().setPiece(this);
    m.getOrigin().setPiece(null);

    }
    }*/
    @Override
    public boolean isValidMove(Move m, Board board) {
        // Analisa se o movimento responde a alguns critérios
        // Se a origem é a mesma do destino, então o movimento não é válido
        // (não implementado ainda)
        // Se o cavalo anda em L
        // Se no destino está ocupado por alguma peça de mesma cor, o movimento não é válido

        boolean validate = false;

        Square origem = m.getOrigin();
        Square destino = m.getDestination();

        if (m.onLimits()) {

            if (destino.getPiece() != null) {
                if (destino.getPiece().getColor().equals(origem.getPiece().getColor())) {
                    validate = false;
                } else {

                    validate = checkPosition(origem, destino, board);



                }
            } else {

                validate = checkPosition(origem, destino, board);
            }


        }

        return validate;
    }

    private boolean checkPosition(Square origem, Square destino, Board board) {
        boolean validate = false;

        Square[] possibleDestiny = new Square[64];
        int countDestiny = 0;

        for (int i = origem.getPositionX() + 1; i < 8; i++) {
            if (board.getGrid()[i][origem.getPositionY()].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                countDestiny++;
            } else {

                if (!board.getGrid()[i][origem.getPositionY()].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                    countDestiny++;
                }

                break;

            }
        }

        for (int i = origem.getPositionX() - 1; i >= 0; i--) {
            if (board.getGrid()[i][origem.getPositionY()].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                countDestiny++;
            } else {

                if (!board.getGrid()[i][origem.getPositionY()].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[i][origem.getPositionY()];
                    countDestiny++;
                }


                break;

            }
        }

        for (int i = origem.getPositionY() + 1; i < 8; i++) {
            if (board.getGrid()[origem.getPositionX()][i].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX()][i].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                    countDestiny++;
                }


                break;

            }
        }

        for (int i = origem.getPositionY() - 1; i >= 0; i--) {
            if (board.getGrid()[origem.getPositionX()][i].getPiece() == null) {
                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                countDestiny++;
            } else {

                if (!board.getGrid()[origem.getPositionX()][i].getPiece().getColor().equals(origem.getPiece().getColor())) {
                    possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][i];
                    countDestiny++;
                }

                break;

            }
        }

        for (int i = 0; i <= countDestiny - 1; i++) {



            if (destino == possibleDestiny[i]) {
                validate = true;
                break;
            }

        }


        return validate;
    }

    public boolean move(Move m, Board board) {

        boolean done = false;

        if (isValidMove(m, board)) {
            m.getDestination().setPiece(this);
            m.getOrigin().setPiece(null);
            if (this.isFirstMove()) {
                this.setFirstMove(false);
            }
            done = true;

        } else {
            roque(m, board, done);

        }

        return done;

    }

    private void roque(Move m, Board board, boolean done) {
        try {

            if ((m.getDestination().getPiece().toString().equals("rei")) && (m.getDestination().getPiece().getColor().equals(m.getOrigin().getPiece().getColor())) && (m.getDestination().getPiece().isFirstMove()) && (m.getOrigin().getPiece().isFirstMove())) {
                switch (m.getOrigin().getPositionX()) {
                    case 7:
                        if ((board.getGrid()[5][m.getOrigin().getPositionY()].getPiece() == null) && (board.getGrid()[6][m.getOrigin().getPositionY()].getPiece() == null)) {
                            this.setFirstMove(false);
                            m.getDestination().getPiece().setFirstMove(false);
                            board.getGrid()[5][m.getOrigin().getPositionY()].setPiece(this);
                            board.getGrid()[6][m.getOrigin().getPositionY()].setPiece(m.getDestination().getPiece());
                            m.getDestination().setPiece(null);
                            m.getOrigin().setPiece(null);
                            done = true;

                        }

                        break;

                    case 0:
                        if ((board.getGrid()[1][m.getOrigin().getPositionY()].getPiece() == null) && (board.getGrid()[2][m.getOrigin().getPositionY()].getPiece() == null) && (board.getGrid()[3][m.getOrigin().getPositionY()].getPiece() == null)) {
                            this.setFirstMove(false);
                            m.getDestination().getPiece().setFirstMove(false);
                            board.getGrid()[2][m.getOrigin().getPositionY()].setPiece(this);
                            board.getGrid()[1][m.getOrigin().getPositionY()].setPiece(m.getDestination().getPiece());
                            m.getDestination().setPiece(null);
                            m.getOrigin().setPiece(null);
                            done = true;

                        }

                        break;


                    default:
                        done = false;
                }


            }//end if


        } catch (NullPointerException e) {
        }




    }

    public String toString() {
        //    System.out.println("torre");
        return "torre";
    }
}
